package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)

func main() {
	// 创建一个服务
	ginServer := gin.Default()

	// 注册中间件
	ginServer.Use(myHandler())

	// 访问地址，处理请求
	ginServer.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "hello,world"})
	})
	ginServer.POST("/user", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "post usr"})
	})
	// 访问地址，接收参数（/user/info?useId=xxx&userName=sali）
	ginServer.GET("/user/info", myHandler(), func(c *gin.Context) {

		// 取出中间件的值
		s := c.MustGet("userSession").(string)
		log.Println("------>", s)

		userId := c.Query("userId")
		userName := c.Query("userName")
		c.JSON(http.StatusOK, gin.H{"userId": userId, "userName": userName})
	})
	// 访问地址，接收参数（/user/info/1/sali）
	ginServer.GET("/user/info/:userId/:userName", func(c *gin.Context) {
		userId := c.Param("userId")
		userName := c.Param("userName")
		c.JSON(http.StatusOK, gin.H{"userId": userId, "userName": userName})
	})
	// 前端给后端传 json
	ginServer.POST("/json", func(c *gin.Context) {
		// request.body
		data, _ := c.GetRawData()
		var m map[string]interface{}
		_ = json.Unmarshal(data, &m)
		fmt.Println(m)
		c.JSON(http.StatusOK, m)
	})

	// 响应一个页面给前端
	// 加载静态页面
	ginServer.LoadHTMLGlob("code/templates/*")
	// 加载资源文件
	ginServer.Static("code/static", "./code/static")
	ginServer.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "这是go 后台传递的数据",
		})
	})

	// 表单提交
	ginServer.POST("/user/add", func(context *gin.Context) {
		username := context.PostForm("userName")
		password := context.PostForm("password")
		context.JSON(http.StatusOK, gin.H{
			"msg":      "ok",
			"userName": username,
			"password": password,
		})
	})

	// 路由
	ginServer.GET("/test", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")
	})

	// 404 No Route
	ginServer.NoRoute(func(c *gin.Context) {
		c.HTML(http.StatusNotFound, "404.html", nil)
	})

	// 路由组
	userGroup := ginServer.Group("/user")
	{
		userGroup.GET("add2", addUser)
		userGroup.POST("login", loginUser)
		userGroup.POST("logout", logoutUser)
	}

	ginServer.Run(":8082")
}

// 自定义 Go 中间件，拦截器
func myHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Set("userSession", "sali-1")
		// 放行
		c.Next()
		// 阻止
		//c.Abort()
	}
}

func addUser(c *gin.Context) {
	// 处理添加用户的逻辑
	c.JSON(200, gin.H{
		"message": "User added",
	})
}

func loginUser(c *gin.Context) {
	// 处理用户登录的逻辑
	c.JSON(200, gin.H{
		"message": "User logged in",
	})
}

func logoutUser(c *gin.Context) {
	// 处理用户登出的逻辑
	c.JSON(200, gin.H{
		"message": "User logged out",
	})
}
